## 异常

# n1 = int(input('请输入一个整数：'))
# n2 = int(input('请输入一个整数：'))
# res = n1/n2   # 注意：当n1输入1， n2输入0；就会出现算数异常 ZeroDivisionError: division by zero
# print('结果：', res)


# try:
#     n1 = int(input('请输入一个整数：'))
#     n2 = int(input('请输入一个整数：'))
#     res = n1 / n2  # 注意：当n1输入1， n2输入0；就会出现算数异常 : division by zero
#     print('结果：', res)
# except ZeroDivisionError:
#     print('除数不能为0！！！')
# except ValueError:
#     print('只能输入数字！！！')
# print('程序结束')



# 🚩 异常语法一
'''
try:
    可能出现异常语法块
except <拦截异常>:
    出现异常执行语法块
except...

注意：except <拦截异常可以不写>: 当except 关键字，并未指定具体要捕获的异常类型，
                            这种省略异常类的 except 语句也是合法的，它表示可捕获所有类型的异常，
                            一般会作为异常捕获的最后一个 except 块。
注意：异常捕获 按照先子类后父类的顺序。
'''


# 🚩 异常语法二：try except else
# 使用 else 包裹的代码，只有当 try 块没有捕获到任何异常时，才会得到执行；反之，如果 try 块捕获到异常，即便调用对应的 except 处理完异常，else 块中的代码也不会得到执行。
'''
try:
    result = 20 / int(input('请输入除数:'))
    print(result)
except ValueError:
    print('必须输入整数')
except ArithmeticError:
    print('算术错误，除数不能为 0')
else:
    print('没有出现异常')
print("继续执行"
'''


# 🚩 异常语法三：try except finally
# finally 语句的功能是：无论 try 块是否发生异常，最终都要进入 finally 语句，并执行其中的代码块。
'''
try:
    a = int(input("请输入 a 的值:"))
    print(20/a)
except:
    print("发生异常！")
else:
    print("执行 else 块中的代码")   
finally :
    print("执行 finally 块中的代码")
'''

# 🚩 异常语法四：try except + else + finally
try:
    n1 = int(input('请输入一个整数：'))
    n2 = int(input('请输入一个整数：'))
    res = n1 / n2  # 注意：当n1输入1， n2输入0；就会出现算数异常 : division by zero
    print('结果：', res)
except BaseException as e:
    print('出错了！！！', e)
else:
    print('没有出现异常才会执行else 结果：', res)
finally:
    print('无论是否异常，都会执行finally 代码块。')
print('程序结束')

# Python常见的异常类型
'''
AttributeError      访问的对象属性不存在

ImportError         无法导入模块或者对象，主要是路径有误或名称错误    

IndentationError    代码没有正确对齐，主要是缩进错误

IndexError          下标索引超出序列范围

IOError             输入/输出异常，主要是无法打开文件

KeyError            访问字典里不存在的键

NameError           访问一个未声明的变量

OverflowError       数值运算超出最大限制

SyntaxError         python语法错误

TabError            Tab和空格混用

TypeError           不同类型数据之间的无效操作（传入对象类型与要求的不符合）

ValueError          传入无效的值，即使值的类型是正确的

ZeroDivisionError    除法运算中除数0 或者 取模运算中模数为0
'''